package com.example.controller;

import com.example.pojo.*;
import com.example.service.controlPlanNewService;
import com.example.service.operateGuideBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * ClassName:operateGuideBookController
 * Description:
 *
 * @Author 赵永峰
 * @Create 2024/7/19 23:16
 * @Version 1.0
 */
@Slf4j
@RestController
public class operateGuideBookController {
    @Autowired
    private operateGuideBookService operateGuideBookService;
    @Autowired
    controlPlanNewService controlPlanNewService;
    @Value("${file.upload-dir}")
    private String saveDir;
    //插入一行全新的数据
    @PostMapping("/interOperateGuideBook")
    public Result interOperateGuideBook(@RequestBody operateGuideBookPojo operateGuideBook){
        operateGuideBookService.interOperateGuideBook(operateGuideBook);
        return Result.success();
    }
    //编辑一行数据，是表头数据
    @PostMapping("/editOperateGuideBookTable")
    public Result editOperateGuideBookTable(@RequestBody operateGuideBookPojo operateGuideBook){
        operateGuideBookService.editOperateGuideBookTable(operateGuideBook);
        return Result.success();
    }
    //删除一行数据，删除的事表头数据,修改的是int形式的数据
    @PostMapping("/editOperateGuideBookFieldInt")
    public Result editOperateGuideBookFieldInt(@RequestBody Map<String, Object> parameters){
        operateGuideBookService.editFieldInt(parameters);
        return Result.success();
    }
    //将符合条件的所有数据查出来，是按照作业指导书的类别查询的。
    @PostMapping("/inquiryOperateGuideBook")
    public Result inquiryOperateGuideBook(@RequestBody Map<String,Object> map){
        List<operateGuideBookPojo> operateGuideBookPojoList=operateGuideBookService.inquiryByOneField(map);
        return Result.success(operateGuideBookPojoList);
    }
    //编辑作业指导书的内容,修改文本类型
    @PostMapping("/editOperateGuideBookField")
    public Result editOperateGuideBookField(@RequestBody Map<String,Object> parameters){
        String filed=operateGuideBookService.editOperateField(parameters);
        return Result.success(filed);
    }
    //上传文件附件的函数
    @PostMapping("/addPictureOperateGuideBook")
    public Result addPictureOperateGuideBook(@RequestParam("file") MultipartFile file, @RequestParam Integer id, @RequestParam String fieldName, @RequestParam String fieldVal,@RequestParam String fileName){
        //上传照片的接口
        String allName = operateGuideBookService.addPictureOperateGuideBook(file,id,fieldName,fieldVal,fileName);
        return Result.success(fieldVal);
    }
    //删除图片的函数
    @PostMapping("/operateGuideBookPictureRemove")
    public Result operateGuideBookPictureRemove(@RequestBody Map<String, Object> parameters) {
        String fileName=operateGuideBookService.operateGuideBookPictureRemove(parameters);
        return Result.success(fileName);
    }
    //下载文件
    @GetMapping("/operateGuideBookDownload")
    public Result operateGuideBookDownload(@RequestParam("fileName") String fileName){
        byte[] file= operateGuideBookService.readFile(fileName);
        System.out.println(fileName);
        return Result.success(file);
    }
    //根据一个id，编辑一个字段，不需要写整行的编辑时间
    @PostMapping("/operateGuideBookOneFiledById")
    public Result operateGuideBookOneFiledById(@RequestBody Map<String,Object> map){
        operateGuideBookService.editOneFiledById(map);
        return Result.success("保存成功");
    }
    @PostMapping("/inquiryOperateGuideBookAll")
    public Result inquiryOperateGuideBookAll(){
        //去查询所有的数据
        List<operateGuideBookPojo> pojos=operateGuideBookService.inquiryGuideBookAll();
        return Result.success(pojos);
    }
    //查询出工序作业指导书中，与控制计划关联的项目，显示到前端
    @PostMapping("/inquiryControlPlanAssociationByOperateGuideBook")
    public Result inquiryControlPlanAssociationByOperateGuideBook(@RequestBody String param){
        List<controlPlanNewPojo> controlPlanPojoList=controlPlanNewService.inquiryControlPlanAssociationByOperateGuideBook(param);
        return Result.success(controlPlanPojoList);
    }
    //修改员工的信息，操作员工
    @PostMapping("/editOperatorOperateGuideBook")
    public Result editOperatorOperateGuideBook(
            @RequestParam(value = "file",required = false) MultipartFile file,
            @RequestParam(required = false) String fieldName,
            @RequestParam(required = false) String fieldVal,
            @RequestParam(required = false) String fileName,
            @RequestParam(required = false) Integer id,
            @RequestParam(required = false) int type,
            @RequestParam(required = false) String oldFileName
    ){
        //新增一个文件
        if (type==0){
            //把文件插入
            try {
                if (!file.isEmpty()) {
                    String filePath = saveDir + fileName;
                    File dest = new File(filePath);
                    // 将文件保存到服务器上的指定位置
                    file.transferTo(dest);
                    System.out.println("保存成功");
                    //向后端修改数据表，调用根据id，修改一个字段
                    // 创建Map实例
                    Map<String, Object> map = new HashMap<>();
                    map.put("id",id);
                    map.put("filedName",fieldName);
                    map.put("filedVal",fieldVal);
                    operateGuideBookService.editOneFiledById(map);
                    return Result.success("修改成功");
                }
                else {
                    return Result.success("没有收到文件，请检查");
                }
            }
            catch (IOException e) {
                return Result.success("文件保存出错，请联系管理员");
            }
        }
        //删除老文件，使用新文件替换老文件
        else if (type==1){
            //1.删除老文件
            String filePath =saveDir + oldFileName;
            // 使用 Paths 类的静态方法 get 来根据给定的文件路径字符串 filePath 创建一个 Path 对象
            Path path = Paths.get(filePath);
            try {
                Files.delete(path);
            }
            catch (IOException e) {
                System.err.println("删除文件时出错: " + e.getMessage());
            }
            //2.删除文件后，修改数据表中存储文件路径的字段
            //向后端修改数据表，调用根据id，修改一个字段
            // 创建Map实例
            Map<String, Object> map = new HashMap<>();
            map.put("id",id);
            map.put("filedName",fieldName);
            map.put("filedVal",fieldVal);
            operateGuideBookService.editOneFiledById(map);
            //3.插入新文件
            try {
                if (!file.isEmpty()) {
                    filePath = saveDir + fileName;
                    File dest = new File(filePath);
                    // 将文件保存到服务器上的指定位置
                    file.transferTo(dest);
                }
            }
            catch (IOException e) {
                System.out.println("文件删除出错");
            }
            return Result.success("数据修改成功");
        }
        //删除文件，并且修改数据
        else if (type==2){
            //1.删除老文件
            String filePath =saveDir + oldFileName;
            // 使用 Paths 类的静态方法 get 来根据给定的文件路径字符串 filePath 创建一个 Path 对象
            Path path = Paths.get(filePath);
            try {
                Files.delete(path);
            }
            catch (IOException e) {
                System.err.println("删除文件时出错: " + e.getMessage());
                //调用service层修改数据库信息
                //删除文件后，修改数据表中存储文件路径的字段
            }
            //2.向后端修改数据表，调用根据id，修改一个字段
            // 创建Map实例
            Map<String, Object> map = new HashMap<>();
            map.put("id",id);
            map.put("filedName",fieldName);
            map.put("filedVal",fieldVal);
            operateGuideBookService.editOneFiledById(map);
            return Result.success("图片删除成功，数据修改成功");
        }
        return Result.success("类型不正确，数据未修改");
    }
}
